//package com.kunchi.isb.base.api;
//
//import com.google.common.collect.Maps;
//import com.kunchi.isb.base.dto.ISBDto;
//import com.kunchi.isb.base.result.ISBResult;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.cglib.beans.BeanMap;
//import org.springframework.http.*;
//import org.springframework.web.client.RestTemplate;
//import org.springframework.web.util.UriComponentsBuilder;
//
//import java.util.Map;
//import java.util.Set;
//
//public abstract class AbstractISBCrudAPI<T extends ISBDto> {
//    private static Logger logger = LoggerFactory.getLogger(AbstractISBCrudAPI.class);
//
//    abstract protected String proxy();
//
//    abstract protected String host();
//
//    abstract protected String port();
//
//    abstract protected String serverName() ;
//
//    abstract protected String servicePath();
//
//
//
//
//    public final ISBResult getById(T param){
//        logger.info("<-----AbstractISBCrudServiceClient.getById:"+param.toString());
////        http请求
//        RestTemplate restTemplate = new RestTemplate();
//        String url = proxy()+host()+":"+port()+ serverName()+"/"+servicePath()+ "/getById";
//        url=findUri( beanToMap(param),url);
//        ResponseEntity<ISBResult> responseEntity = restTemplate.getForEntity(url,ISBResult.class);
//        logger.info("AbstractISBCrudServiceClient.getById----->");
//          return responseEntity.getBody();
//    }
//
//
//    public final ISBResult findByList(T param){
//        logger.info("<-----AbstractISBCrudServiceClient.findByList:"+param.toString());
//        RestTemplate restTemplate = new RestTemplate();
//        String url =proxy()+host()+":"+port()+ serverName()+"/"+serverName()+"/"+servicePath()+ "/findByList";
//        url=findUri(beanToMap(param),url);
//        ResponseEntity<ISBResult> responseEntity = restTemplate.getForEntity(url,ISBResult.class);
//        logger.info("AbstractISBCrudServiceClient.findByList----->");
//        return responseEntity.getBody();
//    }
//
//    public final ISBResult add(T param){
//        logger.info("<-----AbstractISBCrudServiceClient.add:"+param.toString());
//        RestTemplate restTemplate = new RestTemplate();
//        String url = proxy()+host()+":"+port()+serverName()+"/"+serverName()+"/"+servicePath()+ "/add";
//        ResponseEntity<ISBResult> responseEntity =  restTemplate.postForEntity(url,param,ISBResult.class);
//        logger.info("AbstractISBCrudServiceClient.add----->");
//        return responseEntity.getBody();
//    }
//
//    public final ISBResult delete(T param){
//        logger.info("<-----AbstractISBCrudServiceClient.delete:"+param.toString());
//        RestTemplate restTemplate = new RestTemplate();
//        String url = proxy()+host()+":"+port()+serverName()+"/"+serverName()+"/"+servicePath()+ "/delete";
//        url=findUri(beanToMap(param),url);
//        HttpHeaders headers = new HttpHeaders();
//        headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
//        HttpEntity<?> entity = new HttpEntity<>(headers);
//        ResponseEntity<ISBResult> responseEntity=restTemplate.exchange(url, HttpMethod.DELETE,entity,ISBResult.class);
//        logger.info("AbstractISBCrudServiceClient.delete----->");
//        return responseEntity.getBody();
//    }
//
//    public final ISBResult update(T param){
//        logger.info("<-----AbstractISBCrudServiceClient.update:"+param.toString());
//        RestTemplate restTemplate = new RestTemplate();
//        HttpHeaders headers = new HttpHeaders();
//        headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
//        HttpEntity<T> entity = new HttpEntity<>(param,headers);
//        String url = proxy()+host()+":"+port()+serverName()+"/"+serverName()+"/"+servicePath()+ "/update";
//        ResponseEntity<ISBResult> responseEntity=restTemplate.exchange(url, HttpMethod.PUT,entity,ISBResult.class,beanToMap(param));
//        logger.info("<-----AbstractISBCrudServiceClient.update");
//        return responseEntity.getBody();
//    }
//
//    /**
//     * 自定义get查询接口
//     * @param methodName
//     * @param param
//     * @return
//     */
//    public final ISBResult customGetRest(String methodName, T param){
//        logger.info("<-----AbstractISBCrudServiceClient.customGetRest:methodName="+methodName+".param="+param.toString());
//        RestTemplate restTemplate = new RestTemplate();
//        String url =proxy()+host()+":"+port()+ serverName()+"/"+serverName()+"/"+servicePath()+ "/"+methodName;
//        url=findUri(beanToMap(param),url);
//        ResponseEntity<ISBResult> responseEntity = restTemplate.getForEntity(url,ISBResult.class);
//        logger.info("AbstractISBCrudServiceClient.customGetRest----->");
//        return responseEntity.getBody();
//    }
//
//    /**
//     * 自定义post接口
//     * @param methodName
//     * @param param
//     * @return
//     */
//    public final ISBResult customPostRest(String methodName, T param){
//        logger.info("<-----AbstractISBCrudServiceClient.customPostRest:methodName="+methodName+".param="+param.toString());
//        RestTemplate restTemplate = new RestTemplate();
//        String url =proxy()+host()+":"+port()+ serverName()+"/"+serverName()+"/"+servicePath()+ "/"+methodName;
//        ResponseEntity<ISBResult> responseEntity = restTemplate.postForEntity(url,param,ISBResult.class);
//        logger.info("AbstractISBCrudServiceClient.customPostRest----->");
//        return responseEntity.getBody();
//    }
//
//    /**
//     * 根据参数拼接url进行Get查询时使用
//     * @param map
//     * @param url
//     * @return
//     */
//    private static String findUri(Map<String,Object> map,String url){
//        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
//        Set<String> keys = map.keySet();
//        for(String key:keys){
//            builder.queryParam(key,map.get(key));
//        }
//        return builder.toUriString();
//    }
//
//    /**
//     * 将对象转化为Map
//     * @param bean
//     * @param <T>
//     * @return
//     */
//    private static <T> Map<String, Object> beanToMap(T bean) {
//        Map<String, Object> map = Maps.newHashMap();
//        if (bean != null) {
//            BeanMap beanMap = BeanMap.create(bean);
//            for (Object key : beanMap.keySet()) {
//                if(null==beanMap.get(key)){
//                    continue;
//                }
//                map.put(key+"", beanMap.get(key));
//            }
//        }
//        return map;
//    }
//
//
//}
